<?php

namespace WebmanGrpc\Event;

/**
 * 基础事件类
 * 
 * 提供事件的基础实现
 */
class Event implements EventInterface
{
    /**
     * 事件名称
     * @var string
     */
    protected string $name;
    
    /**
     * 事件数据
     * @var array
     */
    protected array $data;
    
    /**
     * 事件时间戳
     * @var int
     */
    protected int $timestamp;
    
    /**
     * 是否停止传播
     * @var bool
     */
    protected bool $propagationStopped = false;
    
    /**
     * 构造函数
     * 
     * @param string $name 事件名称
     * @param array $data 事件数据
     */
    public function __construct(string $name, array $data = [])
    {
        $this->name = $name;
        $this->data = $data;
        $this->timestamp = time();
    }
    
    /**
     * {@inheritdoc}
     */
    public function getName(): string
    {
        return $this->name;
    }
    
    /**
     * {@inheritdoc}
     */
    public function getData(): array
    {
        return $this->data;
    }
    
    /**
     * {@inheritdoc}
     */
    public function getTimestamp(): int
    {
        return $this->timestamp;
    }
    
    /**
     * {@inheritdoc}
     */
    public function isPropagationStopped(): bool
    {
        return $this->propagationStopped;
    }
    
    /**
     * {@inheritdoc}
     */
    public function stopPropagation(): void
    {
        $this->propagationStopped = true;
    }
    
    /**
     * 设置事件数据
     * 
     * @param array $data 事件数据
     * @return void
     */
    public function setData(array $data): void
    {
        $this->data = $data;
    }
    
    /**
     * 获取事件数据值
     * 
     * @param string $key 数据键
     * @param mixed $default 默认值
     * @return mixed 数据值
     */
    public function getDataValue(string $key, $default = null)
    {
        return $this->data[$key] ?? $default;
    }
    
    /**
     * 设置事件数据值
     * 
     * @param string $key 数据键
     * @param mixed $value 数据值
     * @return void
     */
    public function setDataValue(string $key, $value): void
    {
        $this->data[$key] = $value;
    }
    
    /**
     * 转换为数组
     * 
     * @return array 事件信息
     */
    public function toArray(): array
    {
        return [
            'name' => $this->name,
            'data' => $this->data,
            'timestamp' => $this->timestamp,
            'propagation_stopped' => $this->propagationStopped,
        ];
    }
    
    /**
     * 转换为JSON字符串
     * 
     * @return string JSON字符串
     */
    public function toJson(): string
    {
        return json_encode($this->toArray());
    }
}